#include <cstdint>
#include <limits>
#include <numeric>
#include <iostream>
// lerp 的意思是linear interpolation
// https://zh.cppreference.com/w/cpp/numeric/midpoint
// 1) a 与 b 和的一半。不出现上溢。若 a 与 b 拥有整数类型而和为奇数，则向 a 
// 取整结果。若 a 与 b 拥有浮点类型，则至多出现一次不准确运算。
// 2) 若 a 与 b 分别指向（就指针算术目的而言的）同一数组对象 x 的 x[i] 与 x[j] ，
// 则返回指向 x[i+(j-i)/2] （或等价地为 x[std::midpoint(i, j)] ）的指针，其中除法向零取整。若 a 与 b 不指向同一数组对象，则行为未定义。

int main()
{
    std::uint32_t a = std::numeric_limits<std::uint32_t>::max();
    std::uint32_t b = std::numeric_limits<std::uint32_t>::max() - 2;
 
    std::cout << "a: " << a << '\n'
              << "b: " << b << '\n'
              << "Incorrect (overflow and wrapping): " << (a + b) / 2 << '\n'
              << "Correct: " << std::midpoint(a, b) << "\n\n";
 
 
    auto on_pointers = [](int i, int j) {
        char const* text = "0123456789";
        char const* p = text + i;
        char const* q = text + j;
        std::cout << "std::midpoint('" << *p << "', '" << *q << "'): '"
                  << *std::midpoint(p, q) << "'\n";
    };
 
    on_pointers(2, 4);
    on_pointers(2, 5);
    on_pointers(5, 2);
    on_pointers(2, 6);
}